Node.js Middleware

Node.js வலைப் பயன்பாடுகளில் மிடில்வேரின் சக்தியைக் கண்டறியவும்

மிடில்வேருக்கு அறிமுகம்

மிடில்வேரானது Node.js வலைப் பயன்பாடுகளின் முக்கிய பகுதியாகும், குறிப்பாக Express.js இல்.

இது உங்கள் பயன்பாட்டின் வழிகள் மற்றும் இறுதிப் புள்ளிகளில் பொதுவான செயல்பாட்டைச் சேர்ப்பதற்கும் மீண்டும் பயன்படுத்துவதற்கும் ஒரு வழியை வழங்குகிறது.

மிடில்வேரின் முக்கிய பண்புகள்:

கோரிக்கை-பதில் சுழற்சியில் இயங்குகிறது

கோரிக்கை மற்றும் பதில் பொருள்களை மாற்றலாம்

கோரிக்கை-பதில் சுழற்சியை முடிக்கலாம்

ஸ்டாக்கில் அடுத்த மிடில்வேரை அழைக்கலாம்

பல நிலைகள்

பயன்பாடு-நிலை, ரூட்டர்-நிலை அல்லது வழி-குறிப்பிட்டதாக இருக்கலாம்

இது மூல கோரிக்கைக்கும் இறுதி வழி கையாளுபவருக்கும் இடையே ஒரு பாலமாக செயல்படுகிறது.

அதன் மையத்தில், மிடில்வேரானது அணுகலைக் கொண்ட ஒரு செயல்பாடு:

மிடில்வேர் செயல்பாடுகள் பல்வேறு பணிகளைச் செய்யலாம்:

மிடில்வேரை பதில் பெறுவதற்கு முன் கோரிக்கைகள் கடந்து செல்லும் தொடர் செயலாக்க அடுக்குகளாக நினைத்துப் பாருங்கள் - HTTP கோரிக்கைகளுக்கான ஒரு அசெம்பிளி வரிசை போன்றது.

மிடில்வேர் எவ்வாறு வேலை செய்கிறது

மிடில்வேர் செயல்பாடுகள் அவை வரையறுக்கப்பட்ட வரிசையில் செயல்படுத்தப்படுகின்றன, கோரிக்கைகள் பாயும் ஒரு குழாயை உருவாக்குகின்றன.

ஒவ்வொரு மிடில்வேர் செயல்பாடும் கோரிக்கை மற்றும் பதில் பொருள்களில் செயல்பாடுகளைச் செய்யலாம் மற்றும் அடுத்த மிடில்வேருக்கு கட்டுப்பாட்டை வழங்க வேண்டுமா அல்லது கோரிக்கை-பதில் சுழற்சியை முடிக்க வேண்டுமா என முடிவு செய்யலாம்.

மிடில்வேரின் மூலம் ஒரு கோரிக்கையின் வாழ்க்கைச் சுழற்சி:

சேவையகத்தால் கோரிக்கை பெறப்பட்டது
வரிசையில் ஒவ்வொரு மிடில்வேரின் மூலமாகவும் அனுப்பப்பட்டது
வழி கையாளுபவர் கோரிக்கையை செயலாக்குகிறார்
பதில் மிடில்வேரின் மூலம் பின்னோக்கி பாய்கிறது (தலைகீழ் வரிசையில்)
கிளையன்டுக்கு பதில் அனுப்பப்பட்டது

Express.js இல் மிடில்வேரின் அடிப்படை முறை இந்த கட்டமைப்பைப் பின்பற்றுகிறது:

app.use((req, res, next) => {
  // மிடில்வேர் குறியீடு இங்கே செல்லும்
  console.log('Time:', Date.now());
  
  // அடுத்த மிடில்வேர் செயல்பாட்டிற்கு கட்டுப்பாட்டை வழங்க next() ஐ அழைக்கவும்
  next();
});

நீங்கள் next() ஐ அழைக்கும்போது, ஸ்டாக்கில் அடுத்த மிடில்வேர் செயல்படுத்தப்படும்.

நீங்கள் next() ஐ அழைக்காவிட்டால், கோரிக்கை-பதில் சுழற்சி முடிகிறது மற்றும் மேலும் மிடில்வேர் இயங்காது.

எடுத்துக்காட்டு: ஒரு எளிய மிடில்வேர் சங்கிலி

const express = require('express');
const app = express();

// முதல் மிடில்வேர்
app.use((req, res, next) => {
  console.log('Middleware 1: This always runs');
  next();
});

// இரண்டாவது மிடில்வேர்
app.use((req, res, next) => {
  console.log('Middleware 2: This also always runs');
  next();
});

// வழி கையாளுபவர்
app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(8080, () => {
  console.log('Server running on port 8080');
});

ரூட் பாதைக்கு ('/') ஒரு கோரிக்கை செய்யப்படும் போது, பின்வருவன நடக்கும்:

மிடில்வேர் வகைகளின் விரிவான வழிகாட்டி

வெவ்வேறு வகையான மிடில்வேரைப் புரிந்துகொள்வது உங்கள் பயன்பாட்டின் தர்க்கத்தை திறம்பட ஒழுங்கமைக்க உதவுகிறது.

அதன் நோக்கம், நோக்கம் மற்றும் பயன்பாட்டில் எவ்வாறு பொருத்தப்பட்டுள்ளது என்பதை அடிப்படையாகக் கொண்டு மிடில்வேரை வகைப்படுத்தலாம்.

🎯 சரியான வகையைத் தேர்ந்தெடுப்பது:

நீங்கள் பயன்படுத்தும் மிடில்வேரின் வகை உங்கள் குறிப்பிட்ட தேவைகளைப் பொறுத்தது, மிடில்வேர் அனைத்து கோரிக்கைகளுக்கும் இயக்கப்பட வேண்டுமா அல்லது குறிப்பிட்ட வழிகளுக்கு மட்டுமே இயக்கப்பட வேண்டுமா, மற்றும் அது ரூட்டர் நிகழ்வுக்கான அணுகல் தேவைப்படுகிறதா என்பது போன்றவை.

Node.js பயன்பாடுகளில், குறிப்பாக Express.js உடன், பல வகையான மிடில்வேர் உள்ளன:

பயன்பாடு-நிலை மிடில்வேர்

பயன்பாடு-நிலை மிடில்வேர் Express பயன்பாடு நிகழ்வுடன் app.use() அல்லது app.METHOD() செயல்பாடுகளைப் பயன்படுத்தி பிணைக்கப்பட்டுள்ளது.

💡 பயன்பாட்டு நிகழ்வுகள்:

பதிவு செய்தல், அங்கீகாரம், கோரிக்கை பாகுபடுத்துதல் மற்றும் ஒவ்வொரு கோரிக்கைக்கும் இயக்கப்பட வேண்டிய பிற செயல்பாடுகள்.

const express = require('express');
const app = express();

// பயன்பாடு-நிலை மிடில்வேர்
app.use((req, res, next) => {
  console.log('Time:', Date.now());
  next();
});

ரூட்டர்-நிலை மிடில்வேர்

ரூட்டர்-நிலை மிடில்வேர் பயன்பாடு-நிலை மிடில்வேரைப் போலவே வேலை செய்கிறது, ஆனால் express.Router() இன் ஒரு நிகழ்வுடன் பிணைக்கப்பட்டுள்ளது.

📁 நன்மைகள்:

சிறந்த குறியீட்டு ஒழுங்கமைப்பு, மாடுலர் ரூட்டிங், மற்றும் குறிப்பிட்ட வழிக் குழுக்களுக்கு மிடில்வேரைப் பயன்படுத்தும் திறன்.

const express = require('express');
const router = express.Router();

// ரூட்டர்-நிலை மிடில்வேர்
router.use((req, res, next) => {
  console.log('Router specific middleware');
  next();
});

router.get('/user/:id', (req, res) => {
  res.send('User profile');
});

// பயன்பாட்டிற்கு ரூட்டரைச் சேர்க்கவும்
app.use('/api', router);

பிழை-கையாளுதல் மிடில்வேர்

பிழை-கையாளுதல் மிடில்வேர் நான்கு வாதங்களுடன் (err, req, res, next) வரையறுக்கப்பட்டு, கோரிக்கை செயலாக்கத்தின் போது ஏற்படும் பிழைகளைக் கையாள பயன்படுத்தப்படுகிறது.

⚠️ முக்கிய புள்ளிகள்:

  • சரியாக நான்கு அளவுருக்கள் இருக்க வேண்டும்
  • மற்ற app.use() மற்றும் வழி அழைப்புகளுக்குப் பிறகு வரையறுக்கப்பட வேண்டும்
  • பிழை கையாளுதல் தர்க்கத்தை மையமாக்க பயன்படுத்தலாம்
  • next(err) ஐப் பயன்படுத்தி பிழைகளை அடுத்த பிழை கையாளுபவருக்கு அனுப்பலாம்
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

உள்ளமைக்கப்பட்ட மிடில்வேர்

Express பொதுவான வலைப் பயன்பாட்டு பணிகளைக் கையாளும் பல உள்ளமைக்கப்பட்ட மிடில்வேர் செயல்பாடுகளை உள்ளடக்கியது.

// JSON உடல்களைப் பாகுபடுத்தவும்
app.use(express.json());

// URL-encoded உடல்களைப் பாகுபடுத்தவும்
app.use(express.urlencoded({ extended: true }));

// நிலையான கோப்புகளைச் சேவை செய்யவும்
app.use(express.static('public'));

மூன்றாம் தரப்பு மிடில்வேர்

Node.js சூழல் Express செயல்பாட்டை நீட்டிக்கும் பல மூன்றாம் தரப்பு மிடில்வேர் தொகுப்புகளை வழங்குகிறது.

const morgan = require('morgan');
const helmet = require('helmet');

// HTTP கோரிக்கை பதிவுக் கருவி
app.use(morgan('dev'));

// பாதுகாப்பு தலைப்புகள்
app.use(helmet());

தனிப்பயன் மிடில்வேரை உருவாக்குதல் மற்றும் பயன்படுத்துதல்

தனிப்பயன் மிடில்வேரை உருவாக்குவது பயன்பாட்டு-குறிப்பிட்ட செயல்பாட்டை மீண்டும் பயன்படுத்தக்கூடிய வழியில் செயல்படுத்த உங்களை அனுமதிக்கிறது.

🔧 சிறந்த நடைமுறைகள்:

  • மிடில்வேரை ஒரு ஒற்றை பொறுப்பில் கவனம் செலுத்த வைக்கவும்
  • மிடில்வேரின் நோக்கம் மற்றும் தேவைகளை ஆவணப்படுத்தவும்
  • பிழைகளை சரியாக கையாளவும்
  • செயல்திறன் தாக்கங்களைக் கருத்தில் கொள்ளவும்
  • விருப்பங்கள் மூலம் மிடில்வேரை உள்ளமைக்கக்கூடியதாக்கவும்

எடுத்துக்காட்டு: எளிய பதிவுக் கருவி மிடில்வேர்

// ஒரு எளிய பதிவு செய்யும் மிடில்வேரை உருவாக்கவும்
function requestLogger(req, res, next) {
  const timestamp = new Date().toISOString();
  console.log(`${timestamp} - ${req.method} ${req.url}`);
  next(); // next() ஐ அழைக்க மறக்காதீர்கள்
}

// மிடில்வேரைப் பயன்படுத்தவும்
app.use(requestLogger);

எடுத்துக்காட்டு: அங்கீகார மிடில்வேர்

// அங்கீகார மிடில்வேர்
function authenticate(req, res, next) {
  const authHeader = req.headers.authorization;
  
  if (!authHeader) {
    return res.status(401).send('Authentication required');
  }
  
  const token = authHeader.split(' ')[1];
  
  // டோக்கனை சரிபார்க்கவும் (எளிமைப்படுத்தப்பட்டது)
  if (token === 'secret-token') {
    // அங்கீகாரம் வெற்றிகரமானது
    req.user = { id: 123, username: 'john' };
    next();
  } else {
    res.status(403).send('Invalid token');
  }
}

// குறிப்பிட்ட வழிகளுக்குப் பயன்படுத்தவும்
app.get('/api/protected', authenticate, (req, res) => {
  res.json({ message: 'Protected data', user: req.user });
});

எடுத்துக்காட்டு: கோரிக்கை சரிபார்ப்பு மிடில்வேர்

// ஒரு பயனர் உருவாக்கும் கோரிக்கையைச் சரிபார்க்கவும்
function validateUserCreation(req, res, next) {
  const { username, email, password } = req.body;
  
  // எளிய சரிபார்ப்பு
  if (!username || username.length < 3) {
    return res.status(400).json({ error: 'Username must be at least 3 characters' });
  }
  
  if (!email || !email.includes('@')) {
    return res.status(400).json({ error: 'Valid email is required' });
  }
  
  if (!password || password.length < 6) {
    return res.status(400).json({ error: 'Password must be at least 6 characters' });
  }
  
  // சரிபார்ப்பு தேர்ச்சி
  next();
}

// பயனர் உருவாக்கும் வழிக்குப் பயன்படுத்தவும்
app.post('/api/users', validateUserCreation, (req, res) => {
  // சரியான பயனர் உருவாக்கத்தை செயலாக்கவும்
  res.status(201).json({ message: 'User created successfully' });
});

பிழை-கையாளுதல் மிடில்வேர்

பிழை-கையாளுதல் மிடில்வேர் சிறப்பு வாய்ந்தது, ஏனெனில் இது மூன்றுக்கு பதிலாக நான்கு அளவுருக்களை எடுக்கும்: (err, req, res, next).

எடுத்துக்காட்டு: அடிப்படை பிழை கையாளுபவர்

const express = require('express');
const app = express();

// பிழையை எறியக்கூடிய வழக்கமான வழி
app.get('/error-demo', (req, res, next) => {
  try {
    // ஒரு பிழையை உருவகப்படுத்தவும்
    throw new Error('Something went wrong!');
  } catch (error) {
    next(error); // பிழை கையாளுபவருக்கு பிழையை அனுப்பவும்
  }
});

// பிழை-கையாளுதல் மிடில்வேர்
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({
    message: 'An error occurred',
    error: process.env.NODE_ENV === 'production' ? {} : err
  });
});

அசிங்க்ரோன் பிழைகளைக் கையாளுதல்

அசிங்க்ரோன் மிடில்வேருக்கு, நம்பிக்கை நிராகரிப்புகளைப் பிடித்து அவற்றை next() க்கு அனுப்புவதை உறுதிப்படுத்திக் கொள்ளுங்கள்:

// சரியான பிழை கையாளுதலுடன் அசிங்க்ரோன் மிடில்வேர்
app.get('/async-data', async (req, res, next) => {
  try {
    const data = await fetchDataFromDatabase();
    res.json(data);
  } catch (error) {
    next(error); // பிழை கையாளுபவருக்கு பிழையை அனுப்பவும்
  }
});

// Express 4.16+ wrapper ஐப் பயன்படுத்தி மாற்று
function asyncHandler(fn) {
  return (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch(next);
  };
}

app.get('/better-async', asyncHandler(async (req, res) => {
  const data = await fetchDataFromDatabase();
  res.json(data);
}));

ℹ️ குறிப்பு:

Express 5 (தற்போது பீட்டாவில்) தானாகவே நம்பிக்கை நிராகரிப்புகளைப் பிடித்து அவற்றை பிழை கையாளுபவருக்கு அனுப்பும்.

மிடில்வேர் செயல்படுத்தும் வரிசை

மிடில்வேர் வரையறுக்கப்பட்ட வரிசை கணிசமாக முக்கியமானது.

Express மிடில்வேரை பயன்பாட்டில் சேர்க்கப்பட்ட வரிசையில் செயல்படுத்துகிறது.

எடுத்துக்காட்டு: வரிசை முக்கியமானது

const express = require('express');
const app = express();

// இந்த மிடில்வேர் முதலில் இயங்கும்
app.use((req, res, next) => {
  console.log('First middleware');
  next();
});

// இந்த மிடில்வேர் /users பாதைகளுக்கு மட்டுமே இயங்கும்
app.use('/users', (req, res, next) => {
  console.log('Users middleware');
  next();
});

// இந்த வழி கையாளுபவர் பொருந்தும் போது இயங்கும்
app.get('/users', (req, res) => {
  res.send('Users list');
});

// இந்த மிடில்வேர் வெற்றிகரமாக பொருந்திய வழிகளுக்கு ஒருபோதும் இயங்காது
// ஏனெனில் வழி கையாளுபவர்கள் கோரிக்கை-பதில் சுழற்சியை முடிக்கிறார்கள்
app.use((req, res, next) => {
  console.log('This will not run for matched routes');
  next();
});

// இது பொருந்தாத வழிகளுக்கான "கேட்ச்-ஆல்" மிடில்வேர்
app.use((req, res) => {
  res.status(404).send('Not found');
});

மிடில்வேர் வரிசைக்கான சிறந்த நடைமுறைகள்:

// 1. பயன்பாடு-அகல மிடில்வேர்
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(morgan('dev'));
app.use(helmet());

// 2. வழி-குறிப்பிட்ட மிடில்வேர்
app.use('/api', authenticate);

// 3. வழிகள்
app.use('/api/users', userRoutes);
app.use('/api/products', productRoutes);

// 4. 404 கையாளுபவர்
app.use((req, res) => {
  res.status(404).json({ message: 'Not found' });
});

// 5. பிழை கையாளுபவர் (எப்போதும் கடைசியாக)
app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).json({ message: 'Server error' });
});

சிறந்த நடைமுறைகள்

Node.js இல் மிடில்வேருடன் பணிபுரியும் போது இந்த சிறந்த நடைமுறைகளைப் பின்பற்றவும்:

1. மிடில்வேரை கவனம் செலுத்த வைக்கவும்

ஒவ்வொரு மிடில்வேரும் ஒரு ஒற்றை பொறுப்பைக் கொண்டிருக்க வேண்டும், ஒற்றை பொறுப்பு கொள்கையைப் பின்பற்ற வேண்டும்.

2. Next() ஐ சரியாகப் பயன்படுத்தவும்

3. அசிங்க்ரோன் குறியீட்டை சரியாக கையாளவும்

அசிங்க்ரோன் மிடில்வேரில் உள்ள பிழைகளை எப்போதும் பிடித்து அவற்றை next() க்கு அனுப்பவும்.

4. மிடில்வேரை அதிகமாகப் பயன்படுத்த வேண்டாம்

பல மிடில்வேர் செயல்பாடுகள் செயல்திறனைப் பாதிக்கலாம். அவற்றை விவேகமாகப் பயன்படுத்தவும்.

5. டொமைனால் ஒழுங்கமைக்கவும்

தொடர்புடைய மிடில்வேரை செயல்பாட்டின் அடிப்படையில் தனி கோப்புகளில் குழுவாக்கவும்.

// middleware/auth.js
exports.authenticate = (req, res, next) => {
  // அங்கீகார தர்க்கம்
};

exports.requireAdmin = (req, res, next) => {
  // நிர்வாகி சரிபார்ப்பு தர்க்கம்
};

// உங்கள் app.js இல்
const { authenticate, requireAdmin } = require('./middleware/auth');

app.use('/admin', authenticate, requireAdmin);

6. நிபந்தனை Next() ஐப் பயன்படுத்தவும்

மிடில்வேர் நிபந்தனைகளின் அடிப்படையில் சங்கிலியைத் தொடர வேண்டுமா இல்லையா என முடிவு செய்யலாம்:

// விகிதம் கட்டுப்படுத்தும் மிடில்வேர் எடுத்துக்காட்டு
function rateLimit(req, res, next) {
  const ip = req.ip;
  
  // IP அதிகமான கோரிக்கைகளைச் செய்துள்ளதா எனச் சரிபார்க்கவும்
  if (tooManyRequests(ip)) {
    return res.status(429).send('Too many requests');
    // குறிப்பு: இங்கே நாம் next() ஐ அழைக்கவில்லை
  }
  
  // இல்லையெனில் தொடரவும்
  next();
}

💡 தொழில்முறை உதவிக்குறிப்பு:

குறிப்பிட்ட உள்ளமைவுகளுடன் மிடில்வேரை உருவாக்கும் செயல்பாடுகளைத் திரும்பப் பெறுவதன் மூலம் மீண்டும் பயன்படுத்தக்கூடிய மிடில்வேர் தொழிற்சாலைகளை உருவாக்கவும்.

// மிடில்வேர் தொழிற்சாலை
function requireRole(role) {
  return (req, res, next) => {
    if (req.user && req.user.role === role) {
      next();
    } else {
      res.status(403).send('Access denied');
    }
  };
}

// பயன்பாடு
app.get('/admin', authenticate, requireRole('admin'), (req, res) => {
  res.send('Admin dashboard');
});

app.get('/editor', authenticate, requireRole('editor'), (req, res) => {
  res.send('Editor dashboard');
});

பயிற்சி

Express மிடில்வேர் செயல்பாடுகள் கோரிக்கை, பதில், மற்றும் ______ பொருள்களுக்கு அணுகலைக் கொண்டுள்ளன.

application
✗ தவறு! "application" பொருள் மிடில்வேர் செயல்பாடுகளுக்கு நேரடியாக அணுகலாக இல்லை
server
✗ தவறு! "server" பொருள் மிடில்வேர் செயல்பாடுகளுக்கு நேரடியாக அணுகலாக இல்லை
next
✓ சரி! "next" என்பது மிடில்வேர் செயல்பாடுகளுக்கு அணுகலைக் கொண்ட மூன்றாவது பொருளாகும், இது அடுத்த மிடில்வேர் செயல்பாட்டைக் குறிக்கிறது
middleware
✗ தவறு! "middleware" என்பது மிடில்வேர் செயல்பாடுகளுக்கு நேரடியாக அணுகலாக இல்லை